package com.xl.core.util.image;

import java.awt.AlphaComposite;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
import com.xl.core.constant.Globals;

/**
 * 为图片添加水印
 * 
 * @author 梁华
 * 
 */
public class ImageMark {

	/**
	 * 给图片添加水印、可设置水印图片旋转角度与透明度
	 * 
	 * @param iconPath
	 *            水印图片路径(需PNG，用以设置透明度)
	 * @param srcImgPath
	 *            源图片路径
	 * @param targerPath
	 *            目标图片路径
	 * @param degree
	 *            水印图片旋转角度
	 * @param alpha
	 *            透明度
	 */
	public static boolean markImageByIcon(String iconPath, String srcImgPath,
			String targerPath, Integer degree, Float alpha) {
		OutputStream os = null;
		try {
			Image srcImg = ImageIO.read(new File(srcImgPath));

			BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null),
					srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);

			// 得到画笔对象
			// Graphics g= buffImg.getGraphics();
			Graphics2D g = buffImg.createGraphics();

			// 设置对线段的锯齿状边缘处理
			g.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
					RenderingHints.VALUE_INTERPOLATION_BILINEAR);

			g.drawImage(
					srcImg.getScaledInstance(srcImg.getWidth(null),
							srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0,
					null);

			if (null != degree) {
				// 设置水印旋转
				g.rotate(Math.toRadians(degree),
						(double) buffImg.getWidth() / 2,
						(double) buffImg.getHeight() / 2);
			}

			// 水印图象的路径 水印一般为gif或者png的，这样可设置透明度
			ImageIcon imgIcon = new ImageIcon(iconPath);

			// 得到Image对象。
			Image img = imgIcon.getImage();

			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP,
					alpha));

			// 表示水印图片的位置
			g.drawImage(img, srcImg.getWidth(null) - img.getWidth(null) - 50,
					srcImg.getHeight(null) - img.getHeight(null) - 20, null);

			g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));

			g.dispose();

			os = new FileOutputStream(targerPath);

			// 生成图片
			ImageIO.write(buffImg, "JPG", os);

			System.out.println("图片完成添加Icon印章。。。。。。");
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		} finally {
			try {
				if (null != os)
					os.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		return true;
	}

	/**
	 * 给图片添加文字水印
	 * 
	 * @param srcImgPath
	 *            源图片路径
	 * @param targerPath
	 *            目标图片路径
	 * @param markContent
	 *            水印的文字
	 * @param markContentColor
	 *            水印文字的颜色
	 * @param x
	 *            x位置
	 * @param y
	 *            y位置
	 * @param qualNum
	 *            图片质量
	 * @return
	 */
	public static boolean markImageByText(String srcImgPath, String targerPath,
			String markContent, Color markContentColor, int x, int y,
			float qualNum) {
		ImageIcon imgIcon = new ImageIcon(srcImgPath);
		Image theImg = imgIcon.getImage();
		int width = theImg.getWidth(null);
		int height = theImg.getHeight(null);
		BufferedImage bimage = new BufferedImage(width, height,
				BufferedImage.TYPE_INT_RGB);
		Graphics2D g = bimage.createGraphics();
		g.setColor(markContentColor);
		g.setBackground(Color.white);
		g.drawImage(theImg, 0, 0, null);
		// 添加水印的文字和设置水印文字出现的内容
		g.drawString(markContent, width / x * (x - 1), height / y * (y - 1));
		g.dispose();
		try {
			FileOutputStream out = new FileOutputStream(targerPath);
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);
			param.setQuality(qualNum, true);
			encoder.encode(bimage, param);
			out.close();
		} catch (Exception e) {
			return false;
		}
		return true;
	}

	/**
	 * 压缩图片
	 * 
	 * @param filePath
	 *            目标图片
	 * @param level
	 *            压缩级别
	 * @param rate
	 *            压缩率
	 */
	public static void compressImage(String filePath, int level, int rate) {
		// 读入文件
		File file = new File(filePath);
		Image img;
		try {
			// 构造Image对象
			img = ImageIO.read(file);
			// 得到源图宽
			int width = img.getWidth(null);
			// 得到源图长
			int height = img.getHeight(null);
			// 按照倍率进行压缩
			int w = (int) width / rate;
			int h = (int) height / rate;

			// 目标地址
			StringBuilder destSb = new StringBuilder(filePath);
			destSb.insert(filePath.indexOf(Globals.DOT), Globals.UNDER_LINE
					+ level);
			File destFile = new File(destSb.toString());
			// 输出到文件流
			FileOutputStream out = new FileOutputStream(destFile);

			// SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 优先级比速度高 生成的图片质量比较好 但速度慢
			BufferedImage image = new BufferedImage(w, h,
					BufferedImage.TYPE_INT_RGB);
			// 绘制缩小后的图
			image.getGraphics().drawImage(img, 0, 0, w, h, null);
			// 可以正常实现bmp、png、gif转jpg
			JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
			// JPEG编码
			encoder.encode(image);
			out.close();

		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// String srcImgPath = "E:/图片/002.jpg";
		// String iconPath = "E:/图片/111.png";
		// String targerPath1 = "E:/图片/temp/img_mark1.jpg";
		// String targerPath2 = "E:/图片/temp/img_mark2.jpg";
		// // 给图片添加水印
		// ImageMark
		// .markImageByIcon(iconPath, srcImgPath, targerPath2, null, 0.6f);
		// ImageMark.markImageByText(srcImgPath, targerPath1, "仅供***平台内部使用",
		// Color.blue, 8, 16, 1);

		ImageMark.compressImage("E:/备份/图片/temp/205.jpg", 3, 3);

	}
}